package com.one.common.utils;

import com.one.common.R;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by yy on 2017/8/9.
 * <p>
 * 字段检测工具类
 */

public class ApplyUtils {
    /**
     * 验证码位数
     */
    private static final int CHECK_CODE_MA_LENTH = 6;

    /**
     * 电话号码正则
     */
    private static final String MOBILE_REG = "^1[3456789]\\d{9}$"; //"^1\\d{10}$";
    private static final String PHONE_REGION_REG = "^(0[1-9][0-9]{1,2})([0-9]{7,8})$";
    private static final String PHONE_400 = "^400([0-9]{7})$";

    /**
          * 第一：普通汽车
          * 车牌号格式：汉字 + A-Z + 5位A-Z或0-9(  车牌号不存在字母I和O防止和1、0混淆)
          * （只包括了普通车牌号，教练车，警等车牌号 。部分部队车，新能源不包括在内）
          * 京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼军空海北沈兰济南广成使领
          * 普通汽车规则："[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}"
          *
          *  第二：新能源车
          * 组成：省份简称（1位汉字）+发牌机关代号（1位字母）+序号（6位），总计8个字符，序号不能出现字母I和字母O
          * 通用规则：不区分大小写，第一位：省份简称（1位汉字），第二位：发牌机关代号（1位字母）
          * 序号位：
          * 小型车，第一位：只能用字母D或字母F，第二位：字母或者数字，后四位：必须使用数字
          * ---([DF][A-HJ-NP-Z0-9][0-9]{4})
          * 大型车，前五位：必须使用数字，第六位：只能用字母D或字母F。
          * ----([0-9]{5}[DF])
          * 新能源车规则："[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))"
          *
          * 总规则："([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1})"
          */

    public static final String PLATE_NO_REGEX = "([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1})";
    public static final String PLATE_NO_AQ_REGEX = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼][0-9]{2}[-]?|[\u4e00-\u9fa5][a-zA-Z]|[\u4e00-\u9fa5]{2}\\d{2}|[\u4e00-\u9fa5]{2}[a-zA-Z])[-]?|([wW][Jj][\u4e00-\u9fa5]{1}[-]?)|([a-zA-Z]{2}))([A-Za-z0-9]{5}|[DdFf][A-HJ-NP-Za-hj-np-z0-9][0-9]{4}|[0-9]{5}[DdFf])$";

    public static boolean checkPlate(String plate){
        return plate.matches(PLATE_NO_REGEX);
    }

    /***
     * 农用车
     * @param plate
     * @return
     */
    public static boolean checkPlateForAgricultural(String plate){
        return plate.matches(PLATE_NO_AQ_REGEX);
    }

    /**
     * 检查输入的是否是数字
     */
    public static boolean checkNumber(String txt) {
        Pattern p = Pattern.compile("[0-9]*");
        Matcher m = p.matcher(txt);
        return m.matches();
    }

    /**
     * 注册页面信息检测
     * 对电话号码进行校验
     * 对验证码进行校验
     * 对单个密码进行校验
     */
    public static boolean checkRegisterInfo(String phoneNumber, String password, String verifyCode, String inviteCode) {
        if (StringUtils.isBlank(inviteCode)) {
            Toaster.showLongToast("请输入邀请码");
            return false;
        }
//        if (inviteCode) {
//            Toaster.showLongToast("请输入正确的邀请码");
//            return false;
//        }
        // 检测手机号
        if (!validateMobile(phoneNumber)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.phone_format_error));
            return false;
        }

        // 验证码格式
        if (StringUtils.isBlank(verifyCode) || verifyCode.length() < CHECK_CODE_MA_LENTH) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.verify_code_error));
            return false;
        }

        // 检测密码格式
        return validatePassword(password);
    }

    /**
     * 检测密码格式
     */
    public static boolean validatePassword(String password) {
        if (StringUtils.isEmpty(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_format_error));
            return false;
        }
        if (password.length() < 6 || password.length() > 16) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_format_error));
            return false;
        }
        // 不能为重复数字
        if (isSameNumberSequence(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_same_number));
            return false;
        }
        // 不能为连续数字 正序
        if (isAscendingNumberSequence(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_sequential));
            return false;
        }
        // 不能为连续数字 倒叙
        if (isDescendingNumberSequence(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_sequential));
            return false;
        }
        // 不能为 重复字母
        if (isSameLetterSequence(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_same_letter));
            return false;
        }

        return true;
    }

    /**
     * 重置密码页面 检测密码格式
     *
     * @param password:校验的密码
     */
    public static boolean validatePasswordInReset(String password) {
        if (StringUtils.isEmpty(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_format_error));
            return false;
        }
        if (password.length() < 6 || password.length() > 16) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_format_error));
            return false;
        }
        // 不能为重复数字
        if (isSameNumberSequence(password)) {
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_too_simple));
            return false;
        }
        if (isSameLetterSequence(password) // 不能为重复字母
                || isSameNumberSequence(password) // 不能为重复数字
                || isAscendingNumberSequence(password) // 不能为连续数字 正序
                || isDescendingNumberSequence(password)) {// 不能为连续数字 倒叙
            Toaster.showShortToast(ResourceUtils.getString(R.string.password_is_too_simple));
            return false;
        }
        return true;
    }


    /**
     * <--------------------------以下为基础检测方法  ----------------------->
     */

    /**
     * 密码不能为重复的数字
     */
    public static boolean isSameNumberSequence(String str) {
        return str.matches("^(\\d)\\1*$");
    }

    /**
     * 字符串不能为重复(字母)
     */
    public static boolean isSameLetterSequence(String str) {
        return str.matches("(\\w)\\1+");
    }

    /**
     * 必须是数字和字母组合
     */
    public static boolean matchPwd(String str) {
        return str.matches("^(?!\\d+$)[\\da-zA-Z]+$");
    }

    /**
     * 连续数字
     */
    public static boolean isAscendingNumberSequence(String str) {
        return "0123456789".contains(str);
    }

    /**
     * 连续数字 倒叙
     */
    public static boolean isDescendingNumberSequence(String str) {
        return "9876543210".contains(str);
    }


    /**
     * 检测手机号
     */
    public static boolean validateMobile(String phone) {
        Pattern pattern = Pattern.compile(MOBILE_REG);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }

    /**
     * 检测400 电话
     */
    public static boolean validPhone400(String phone) {
        Pattern pattern = Pattern.compile(PHONE_400);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }

    /**
     * 检测 带区号号码
     */
    public static boolean validatePhoneWithRegion(String phone) {
        Pattern pattern = Pattern.compile(PHONE_REGION_REG);
        Matcher matcher = pattern.matcher(phone);
        return matcher.matches();
    }

    public static boolean validatePhoneOrMobile(String phone) {
        return validateMobile(phone) || validatePhoneWithRegion(phone);
    }

}
